package mc857;

import mc857.Composicao;

public class Timestamp{
    private String idDono;
    public int t_inicio;
    public int t_final;
    public Timestamp proximo = null;
    public Timestamp anterior = null;
    
    /**
     * Constructor da classe.
     * @param id
     * @param t_inicio
     * @param t_final
     */
    public Timestamp(String id, int t_inicio , int t_final){
    	assert (t_inicio < t_final): "Tempo de inicio maior ou igual ao tempo final na criacao do Timestamp";
    	
		this.idDono = id;
		this.t_inicio = t_inicio;
		this.t_final  = t_final;
    }
    
    
    /**
     * Conecta o Timestamp em uma lista, inserindo-o entre os ant e prox.
     * @param ant
     * @param prox
     */
    public void conectar(Timestamp ant, Timestamp prox){
		if (ant == null) System.out.println("AVISO: em conectar o Timestamp, anterior passado como null.");
		
		if (prox == null) System.out.println("AVISO: em conectar o Timestamp, proximo passado como null.");
		
		if (ant.proximo != null) System.out.println("AVISO: em conectar Timestamp, sobreescrevendo ant.proximo");
		if (prox.anterior != null) System.out.println("AVISO: em conectar Timestamp, sobreescrevendo prox.anterior");
	
		// Liga o Timestamp atual aos passados
		if (ant != null)  this.anterior = ant;
		if (prox != null) this.proximo  = prox;
	
		// Liga os Timestamp anteriores a este
		if (ant != null)  ant.proximo   = this;
		if (prox != null) prox.anterior = this;
	    }
	
	
	/**
	 * Desconecta o Timestamp das filas duplamente ligadas dos timestamps.
	 */
    public void desconectar(){
    	ControleGeral contr = ControleGeral.getInstance();
		Composicao comp = contr.getComposicao(idDono);
	
		comp.setAtualizado(false);                                            		// Coloca a composicao deste tb como desatualizada
		if (this.anterior != null) this.anterior.proximo = this.proximo;            // Faz o apontador do elemento anterior apontar para null
		if (this.proximo != null) this.proximo.anterior = this.anterior;
		
		// Os asserts de pos-condicao sao exatamente a verificacao do passo acima
		assert ((this.anterior != null) && (this.anterior.proximo == this.proximo)): "Problema ao desconectar o anterior do timestamp";
		assert ((this.proximo != null) && (this.proximo.anterior == this.anterior)): "Problema ao desconectar o proximo do timestamp";
    }
	
    
    /**
     * Retorna o ID do dono (Composicao) do Timestamp
     * @return String
     */
	public String getIDdono(){
    	ControleGeral contr = ControleGeral.getInstance();

		assert (contr.getComposicao(this.idDono) == null): "Nao foi possivel achar a composicao com o id " + this.idDono;
		return this.idDono;
	}
	 
}
